#include "algoritmos.h"

long bmhLinha(char *linha, char *padrao, int numLinha, int erro, int* ocorrencias) {
  int n = strlen(linha);
  int m = strlen(padrao);
  long i, j, k;
  long d[MAX_CHAR];
  long comp=0;
  *ocorrencias = 0;
  
  // pre processamento
  for (j=0; j<=MAX_CHAR; j++) {
     d[j] = m;
  }
  
  for (j=1; j<m; j++) {
      d[(int)padrao[j-1]] = m-j;
  }
  
  
  // busca
  i = m;
  while (i<=n) {
    k=i;
    j=m;
    while (linha[k-1] == padrao[j-1] && j>0) { 
       k--; 
       j--; 
       comp++;
    }
    if (j==0) {
       if (!ANALISE) imprimeResultado(linha, padrao, numLinha, k+1);
       (*ocorrencias)++;
    }
    i+=d[(int)linha[i-1]];
  }

  return comp;
}


long bmhTexto(char **texto, char *padrao, int nLinhasTexto, int linhaInicial, int erro, float *tempo, int* ocorrencias) {
    
    long comparacoes = 0;
    int i=0;
    int ocorrenciasLinha = 0;
    
    clock_t inicio, fim;
    inicio = clock();
    *ocorrencias = 0;
    
    for (i=0; i<nLinhasTexto; i++) {
        char *linha = texto[i];
        comparacoes += bmhLinha(linha, padrao, linhaInicial, erro, &ocorrenciasLinha);
        linhaInicial++;
        *ocorrencias += ocorrenciasLinha;
        
    }
    
    fim = clock();
    *tempo = ( (float)fim -(float)inicio ) / ( (float)CLOCKS_PER_SEC );
    
    return comparacoes;
}
